L'écriture en modules permet une meilleure organisation du code en le scindant en différents fichiers, qui échangent des
fonctionnalités via les instructions import
et export
.
defer
)
Avant l'introduction des modules, tous les scripts partageaient le même espace global
<!doctype html>
<html>
<head>
<meta charset="UTF-8"/>
<title>Ma page</title>
</head>
<body>
<script src="script1.js"></script>
<script src="script2.js"></script>
<script>
alert(maVariable); //tata
</script>
</body>
</html>
script1.js
var maVariable = "toto";
script2.js
var maVariable = "tata";
Pour pallier ce problème, on utilisait des IIFE (Immediately Invoked Function Expression).
(function() {
"use strict";
function affiche() {
window.alert("un clic s'est produit");
}
let div = document.getElementById("maDiv");
div.addEventListener("click", affiche);
window.variableApartager = "quelque chose à partager";
}());
Le code est encapsulé dans une fonction anonyme aussitôt exécutée, ce qui protège les variables de l'espace global.
<!doctype html>
<html>
<head>
<meta charset="UTF-8"/>
<title>Ma page</title>
<script type="module" src="script1.js"></script>
</head>
<body>
<!-- Contenu de la page -->
</body>
</html>
script1.js
import { test, nom, nom2 } from "./script2.js"
script2.js
const nom = "une valeur à partager";
export { nom };
export const nom2 = "autre valeur à partager";
export function test() { /* une fonctionnalité à partager */ }
script1.js
export const nom = "valeur à partager";
export default function test() { /* une fonctionnalité à partager */ }
script2.js
import testFct from "./script1.js"
script1.js
export function test() { /* une fonctionnalité à partager */ }
script2.js
import { test as monChoixDeNom } from "./script1.js"
script1.js
export const nom = "une valeur à partager";
export function test() { /* une fonctionnalité à partager */ }
script2.js
import * as Module from "./script1.js"
Module.nom // "une valeur à partager"
Module.test()
utils/fct1.js
export default function fct() { /* ... */ }
utils/fct2.js
export default function fct() { /* ... */ }
utils/index.js
export { default as fct1 } from "./utils/fct1.js"
export { default as fct2 } from "./utils/fct2.js"
script.js
import { fct1, fct2 } from "./utils/index.js"
script1.js
export function fct() { /* ... */ }
script2.js
const button = document.getElementById("monBouton");
button.addEventListener("click", async() => {
const Module = await import("./script1.js");
Module.fct();
})